#!/bin/bash

# MCSM Pro版安装脚本
# 运行方式: curl -fsSL https://gitee.com/wwwwwddzafv/mcsmpro/raw/master/mcsm-install-pro.sh | bash
# 作者: MCSM Pro Team
# 版本: 1.0.0

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 全局变量
BASE_PATH="/opt/mcsmanager"
NODE_VERSION="v20.11.0"
REQUIRED_NODE_VERSION="20.11.0"
IS_CHINA=""
SERVER_IP=""

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [ "$EUID" -ne 0 ]; then
        log_error "请使用root权限运行此脚本"
        log_info "使用命令: sudo bash <(curl -sSL -k https://gitee.com/wwwwwddzafv/mcsmpro/raw/master/mcsm-install-pro.sh)"
        exit 1
    fi
}

# 检测地理位置
detect_location() {
    log_step "检测服务器地理位置..."
    
    local location_info
    location_info=$(curl -s -k --connect-timeout 10 cip.cc 2>/dev/null || echo "")
    
    if [ -z "$location_info" ]; then
        log_warn "无法获取地理位置信息，默认使用海外源"
        IS_CHINA="false"
        return
    fi
    
    # 提取IP地址
    SERVER_IP=$(echo "$location_info" | grep "IP" | awk -F: '{print $2}' | xargs)
    
    # 提取数据二字段
    local data_two
    data_two=$(echo "$location_info" | grep "数据二" | awk -F: '{print $2}' | xargs)
    
    log_info "服务器IP: $SERVER_IP"
    log_info "地理位置: $data_two"
    
    # 判断是否在中国大陆（排除港澳台）
    if echo "$data_two" | grep -q "中国" && ! echo "$data_two" | grep -qE "(香港|澳门|台湾)"; then
        IS_CHINA="true"
        log_info "检测到服务器位于中国大陆，将使用国内镜像源"
    else
        IS_CHINA="false"
        log_info "检测到服务器位于海外或港澳台地区，将使用官方源"
    fi
}

# 版本比较函数
version_compare() {
    local version1=$1
    local version2=$2
    
    # 移除v前缀
    version1=${version1#v}
    version2=${version2#v}
    
    # 使用sort -V进行版本比较
    if [ "$(printf '%s\n' "$version1" "$version2" | sort -V | head -n1)" = "$version2" ]; then
        return 0  # version1 >= version2
    else
        return 1  # version1 < version2
    fi
}

# 检查Node.js版本
check_node_version() {
    log_step "检查Node.js版本..."
    
    if command -v node >/dev/null 2>&1; then
        local current_version
        current_version=$(node --version)
        log_info "当前Node.js版本: $current_version"
        
        if version_compare "$current_version" "$REQUIRED_NODE_VERSION"; then
            log_info "Node.js版本满足要求，跳过安装"
            return 0
        else
            log_warn "Node.js版本过低，需要升级到 $NODE_VERSION"
            return 1
        fi
    else
        log_warn "未检测到Node.js，需要安装"
        return 1
    fi
}

# 安装Node.js
install_nodejs() {
    log_step "安装Node.js $NODE_VERSION..."
    
    local node_url
    if [ "$IS_CHINA" = "true" ]; then
        node_url="https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/$NODE_VERSION/node-$NODE_VERSION-linux-x64.tar.xz"
        log_info "使用清华大学镜像下载Node.js"
    else
        node_url="https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-linux-x64.tar.xz"
        log_info "使用官方源下载Node.js"
    fi
    
    # 创建临时目录
    local temp_dir="/tmp/mcsm-install"
    mkdir -p "$temp_dir"
    cd "$temp_dir"
    
    # 下载Node.js
    log_info "正在下载Node.js..."
    if ! curl -L -k -o "node-$NODE_VERSION-linux-x64.tar.xz" "$node_url"; then
        log_error "Node.js下载失败"
        exit 1
    fi
    
    # 解压Node.js
    log_info "正在解压Node.js..."
    tar -xf "node-$NODE_VERSION-linux-x64.tar.xz"
    
    # 移动到/opt目录
    if [ -d "/opt/node-$NODE_VERSION-linux-x64" ]; then
        rm -rf "/opt/node-$NODE_VERSION-linux-x64"
    fi
    mv "node-$NODE_VERSION-linux-x64" "/opt/"
    
    # 创建软链接
    ln -sf "/opt/node-$NODE_VERSION-linux-x64/bin/node" /usr/bin/node
    ln -sf "/opt/node-$NODE_VERSION-linux-x64/bin/npm" /usr/bin/npm
    
    # 验证安装
    local installed_version
    installed_version=$(node --version)
    log_info "Node.js安装完成，版本: $installed_version"
    
    # 清理临时文件
    cd /
    rm -rf "$temp_dir"
}

# 下载MCSM面板
download_mcsm() {
    log_step "下载MCSM面板..."
    
    # 定义镜像源列表（按优先级排序）
    local mirror_urls=()
    if [ "$IS_CHINA" = "true" ]; then
        mirror_urls=(
            "https://gh.felicity.ac.cn/https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz"
            "https://gh.llkk.cc/https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz"
            "https://gh.b52m.cn/https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz"
            "https://gh-proxy.com/https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz"
            "https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz"
        )
        log_info "使用国内镜像源下载MCSM面板"
    else
        mirror_urls=(
            "https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz"
        )
        log_info "使用官方源下载MCSM面板"
    fi
    
    # 创建临时下载目录
    local temp_dir="/tmp/mcsm_install_$$"
    mkdir -p "$temp_dir"
    cd "$temp_dir"
    
    # 尝试从各个镜像源下载
    local download_success=false
    local current_mirror=1
    local total_mirrors=${#mirror_urls[@]}
    
    for mcsm_url in "${mirror_urls[@]}"; do
        log_info "正在尝试从镜像源 $current_mirror/$total_mirrors 下载MCSM面板..."
        log_info "下载地址: $mcsm_url"
        
        # 尝试下载
        if curl -L -k -o mcsmanager_linux_release.tar.gz "$mcsm_url"; then
            # 检查下载的文件大小，确保不是错误页面
            local file_size=$(stat -c%s "mcsmanager_linux_release.tar.gz" 2>/dev/null || echo "0")
            if [ "$file_size" -gt 1048576 ]; then  # 大于1MB
                log_info "从镜像源 $current_mirror 下载成功 (文件大小: ${file_size} 字节)"
                download_success=true
                break
            else
                log_warn "从镜像源 $current_mirror 下载的文件过小 (${file_size} 字节)，可能是错误页面，尝试下一个镜像源..."
                rm -f mcsmanager_linux_release.tar.gz
            fi
        else
            log_warn "从镜像源 $current_mirror 下载失败，尝试下一个镜像源..."
        fi
        
        current_mirror=$((current_mirror + 1))
    done
    
    # 检查是否下载成功
    if [ "$download_success" = false ]; then
        log_error "所有镜像源都下载失败，请检查网络连接或稍后重试"
        cd /
        rm -rf "$temp_dir"
        exit 1
    fi
    
    # 解压面板
    log_info "正在解压MCSM面板..."
    tar -zxf mcsmanager_linux_release.tar.gz
    
    # 检查解压后的目录结构并移动到目标位置
    if [ -d "MCSManager" ]; then
        # 如果解压出MCSManager目录
        mkdir -p "$BASE_PATH"
        cp -r MCSManager/* "$BASE_PATH/"
    elif [ -d "mcsmanager" ]; then
        # 如果解压出mcsmanager目录（小写）
        mkdir -p "$BASE_PATH"
        cp -r mcsmanager/* "$BASE_PATH/"
    elif [ -d "daemon" ] && [ -d "web" ]; then
        # 如果直接解压出daemon和web目录
        mkdir -p "$BASE_PATH"
        cp -r daemon "$BASE_PATH/"
        cp -r web "$BASE_PATH/"
        [ -d "panel" ] && cp -r panel "$BASE_PATH/"
    else
        # 检查当前目录下的所有内容
        log_info "检查解压内容..."
        ls -la
        # 将所有内容移动到目标目录
        mkdir -p "$BASE_PATH"
        cp -r * "$BASE_PATH/" 2>/dev/null || true
    fi
    
    # 清理临时文件
    cd /
    rm -rf "$temp_dir"
    
    # 验证必要目录是否存在
    if [ ! -d "$BASE_PATH/daemon" ]; then
        log_error "daemon目录不存在，请检查下载的文件"
        log_info "当前$BASE_PATH目录内容："
        ls -la "$BASE_PATH"
        exit 1
    fi
    
    if [ ! -d "$BASE_PATH/web" ]; then
        log_error "web目录不存在，请检查下载的文件"
        log_info "当前$BASE_PATH目录内容："
        ls -la "$BASE_PATH"
        exit 1
    fi
    
    log_info "MCSM面板下载完成"
}

# 安装面板依赖
install_dependencies() {
    log_step "安装面板依赖..."
    
    # 安装daemon依赖
    log_info "安装daemon依赖..."
    cd "${BASE_PATH}/daemon"
    npm install --production --no-fund --no-audit
    
    # 安装web依赖
    log_info "安装web依赖..."
    cd "${BASE_PATH}/web"
    npm install --production --no-fund --no-audit
    
    log_info "依赖安装完成"
}

# 创建systemd服务
create_systemd_service() {
    log_step "创建systemd服务..."
    
    # 创建daemon服务
    cat > /etc/systemd/system/mcsm-daemon.service << EOF
[Unit]
Description=MCSM Daemon
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=${BASE_PATH}/daemon
ExecStart=/usr/bin/node --max-old-space-size=8192 --enable-source-maps app.js
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

    # 创建web服务
    cat > /etc/systemd/system/mcsm-web.service << EOF
[Unit]
Description=MCSM Web Panel
After=network.target mcsm-daemon.service

[Service]
Type=simple
User=root
WorkingDirectory=${BASE_PATH}/web
ExecStart=/usr/bin/node --max-old-space-size=8192 --enable-source-maps app.js
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

    # 重载systemd配置
    systemctl daemon-reload
    
    # 启用服务
    systemctl enable mcsm-daemon
    systemctl enable mcsm-web
    
    log_info "systemd服务创建完成"
}

# 启动服务并获取信息
start_services() {
    log_step "启动MCSM服务..."
    
    # 启动daemon
    log_info "启动daemon服务..."
    systemctl start mcsm-daemon
    sleep 3
    
    # 启动web
    log_info "启动web服务..."
    systemctl start mcsm-web
    sleep 3
    
    # 检查服务状态
    if systemctl is-active --quiet mcsm-daemon; then
        log_info "daemon服务启动成功"
    else
        log_error "daemon服务启动失败"
        systemctl status mcsm-daemon
        exit 1
    fi
    
    if systemctl is-active --quiet mcsm-web; then
        log_info "web服务启动成功"
    else
        log_error "web服务启动失败"
        systemctl status mcsm-web
        exit 1
    fi
}

# 获取节点密钥
get_daemon_key() {
    log_step "获取节点密钥..."
    
    local config_file="${BASE_PATH}/daemon/data/Config/global.json"
    local max_attempts=15
    local attempt=0
    
    while [ $attempt -lt $max_attempts ]; do
        if [ -f "$config_file" ]; then
            local daemon_key
            # 使用更可靠的JSON解析方法
            daemon_key=$(cat "$config_file" | grep -o '"key"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"key"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
            if [ -n "$daemon_key" ] && [ "$daemon_key" != "null" ]; then
                echo ""
                echo "=========================================="
                echo -e "${GREEN}节点密钥: $daemon_key${NC}"
                echo "=========================================="
                return 0
            fi
        fi
        
        log_info "等待配置文件生成... (尝试 $((attempt + 1))/$max_attempts)"
        sleep 3
        attempt=$((attempt + 1))
    done
    
    # 如果仍然无法获取，尝试直接显示文件内容
    if [ -f "$config_file" ]; then
        log_info "配置文件存在，尝试直接读取..."
        local file_content=$(cat "$config_file" 2>/dev/null)
        if [ -n "$file_content" ]; then
            local daemon_key=$(echo "$file_content" | grep -o '"key"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"key"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
            if [ -n "$daemon_key" ] && [ "$daemon_key" != "null" ]; then
                echo ""
                echo "=========================================="
                echo -e "${GREEN}节点密钥: $daemon_key${NC}"
                echo "=========================================="
                return 0
            fi
        fi
    fi
    
    log_warn "无法获取节点密钥，请手动查看: $config_file"
    return 1  # 明确返回错误状态，但不退出脚本
}

# 显示安装完成信息
show_completion_info() {
    echo ""
    echo "=========================================="
    echo -e "${GREEN}MCSM Pro版安装完成！${NC}"
    echo "=========================================="
    echo ""
    echo -e "${BLUE}面板访问地址:${NC}"
    if [ -n "$SERVER_IP" ]; then
        echo "  http://$SERVER_IP:23333"
    else
        echo "  http://您的服务器IP:23333"
    fi
    echo ""
    echo -e "${BLUE}端口信息:${NC}"
    echo "  面板端口: 23333"
    echo "  节点端口: 24444"
    echo ""
    echo -e "${BLUE}服务管理命令:${NC}"
    echo "  启动面板: systemctl start mcsm-web"
    echo "  启动节点: systemctl start mcsm-daemon"
    echo "  停止面板: systemctl stop mcsm-web"
    echo "  停止节点: systemctl stop mcsm-daemon"
    echo "  重启面板: systemctl restart mcsm-web"
    echo "  重启节点: systemctl restart mcsm-daemon"
    echo "  查看状态: systemctl status mcsm-web"
    echo "  查看日志: journalctl -u mcsm-web -f"
    echo ""
    echo -e "${YELLOW}注意事项:${NC}"
    echo "  1. 如果是NAT服务器，请手动添加端口映射"
    echo "  2. 确保防火墙已开放23333和24444端口"
    echo "  3. 首次登录请使用默认账号密码"
    echo ""
    echo "=========================================="
}

# 安装命令行菜单
install_command_menu() {
    log_step "安装命令行管理菜单..."
    
    # 下载菜单脚本到/usr/bin目录（在PATH中）
    if curl -sSL -k https://gitee.com/wwwwwddzafv/mcsmpro/raw/master/mcsm-menu.sh -o /usr/bin/mcsm; then
        # 设置执行权限
        chmod +x /usr/bin/mcsm
        log_info "命令行菜单安装完成，使用 'mcsm' 命令打开菜单"
    else
        log_warn "命令行菜单下载失败，可稍后手动安装"
    fi
}

# 主函数
main() {
    echo ""
    echo "=========================================="
    echo -e "${GREEN}MCSM Pro版安装脚本${NC}"
    echo "=========================================="
    echo ""
    
    # 检查root权限
    check_root
    
    # 检测地理位置
    detect_location
    
    # 检查并安装Node.js
    if ! check_node_version; then
        install_nodejs
    fi
    
    # 下载MCSM面板
    download_mcsm
    
    # 安装依赖
    install_dependencies
    
    # 创建systemd服务
    create_systemd_service
    
    # 启动服务
    start_services
    
    # 获取节点密钥
    get_daemon_key || true  # 即使失败也继续执行
    
    # 安装命令行菜单
    install_command_menu
    
    # 显示完成信息
    show_completion_info
    
    log_info "安装完成！"
}

# 执行主函数
main "$@"